package educar.controllers;

import educar.gui.AdminView;
import educar.gui.IView;
import educar.models.Docente;
import educar.models.Persona;
import educar.models.User;
import educar.models.docenteNotFound;
import educar.models.personaNotFound;
import educar.models.userNotFound;
import educar.models.Alumno;
import educar.models.alumnoNotFound;

//TODO: crear borrar completo
public class AdminAlumnoController implements IController
{
    AdminView view;

    public void setView(IView view)
    {
        this.view = (AdminView)view;
        actualizarAlumnos();
    }

    public void processItemList(String name, String item)
    {
        Alumno alumno = null;
        try
        {
        	alumno = Alumno.getAlumnoByDni(name); 

        	view.setAlumnoNombre(alumno.getNombre());
            view.setAlumnoDni(alumno.getDni());
            view.setAlumnoApellido(alumno.getApellido());
            view.setAlumnoNro(alumno.getCodigo());
        }
        catch (alumnoNotFound e)
        {
            e.printStackTrace();
        }
        try
        {
            User usuario = User.getUserByDniUserRole(alumno.getDni(), "Alumno");
            view.setAlumnoContrasena(usuario.getPassword());
            view.setAlumnoUsuario(usuario.getUsername());
        }
        catch (userNotFound e)
        {
            //simplemente mostramos los campos vacios
            //puede crearle un usuario con actualizar
            view.setAlumnoContrasena("no tiene");
            view.setAlumnoUsuario("no tiene");
        }
    }

    public void process(String model)
    {
        if (model.compareTo(AdminView.RESET) == 0)
            reset();
        else if (model.compareTo(AdminView.ACTUALIZAR) == 0)
            update();
        else if (model.compareTo(AdminView.GUARDARNUEVO) == 0)
            guardar();
        else if (model.compareTo(AdminView.BORRAR) == 0)
            borrar();
    }

    private void reset()
    {
        view.setAlumnoNombre("");
        view.setAlumnoDni("");
        view.setAlumnoApellido("");
        view.setAlumnoNro("");
        view.setAlumnoContrasena("");
        view.setAlumnoUsuario("");
    }

    private void update()
    {
        try //TODO: informar que no se puede modificar dni
        {
            if (view.getAlumnoContrasena().trim().isEmpty())
            {
                view.present("Error");
                return;
            }

            User u = User.getUserByDniUserRole(view.getAlumnoDni(), "Alumno");

            if (view.getAlumnoUsuario().compareTo(u.getUsername()) != 0)
            {
                view.present("No se puede modificar el usuario");
                return;
            }

            u.setPassword(view.getAlumnoContrasena());
            u.update();
        }
        catch (userNotFound e1)
        {
            view.present("Error");
        }
        try
        {
            Alumno a = Alumno.getAlumnoByDni(view.getAlumnoDni());
            a.setNombre(view.getAlumnoNombre());
            a.setApellido(view.getAlumnoApellido());
            a.update();
        }
        catch (alumnoNotFound e)
        {
            view.present("Actualizacion no valida de datos del Alumno");
        }
    }

    private void guardar()
    {
        if (view.getAlumnoDni().trim().isEmpty() ||
                view.getAlumnoUsuario().trim().isEmpty() ||
                view.getAlumnoContrasena().trim().isEmpty())
        {
            view.present("Error: Campos obligatorios vacíos");
            return;
        }

        Alumno a = new Alumno(view.getAlumnoApellido(), view.getAlumnoNombre(), view.getAlumnoDni());
        if (!a.save())  //TODO: permitir guardar solo alumno
        {
            view.present("Error al guardar");
            return;
        }

        User u = new User(view.getAlumnoDni(), view.getAlumnoUsuario(), view.getAlumnoContrasena(), "Alumno");
        if (!u.save())
        {
            view.present("Error al guardar");
            a.destroy();//ya que el usuario no se creo
            return;
        }

        view.setAlumnoNro(a.getCodigo());
        actualizarAlumnos();
    }

    public void actualizarAlumnos()
    {
        String[] alumnos;
        alumnos = Alumno.getAllArray();
        ((AdminView)view).setAlumnos(alumnos);
    }

    private void borrar()
    {
        try
        {
            User usuario  = User.getUserByDniUserRole(view.getAlumnoDni(), "Alumno");
            usuario.destroy();
        }
        catch (userNotFound e1)
        {
            view.present("Usuario inexistente");
        }
        try
        {
            //no borra persona, porque puede ser un alumno ademas
            Alumno alumno = Alumno.getAlumnoByDni(view.getAlumnoDni());
            alumno.destroy();
            try
            {
                Docente.getDocenteByDni(view.getAlumnoDni());
            }
            catch (docenteNotFound d)
            {
                try
                {
                    Persona p = Persona.getPersonaByDni(view.getAlumnoDni());
                    p.destroy();
                }
                catch (personaNotFound pe)
                {}
            }
            reset();
            actualizarAlumnos();
        }
        catch (alumnoNotFound e)
        {
            view.present("Alumno inexistente");
        }
    }
}
